#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
#define MAX_NAMES 100  
#define MAX_NAME_LENGTH 100  
#define MAX_COMBINATIONS 10000  
  
char **name; // 存储名字的字符串数组  
char **ans; // 存储答案的字符串数组  
int *chosen; // 存储已选择的数的索引  
int n, m; // 共计N个数，选m个数  
int ansSize = 0; // 答案的数量  
  
void clc(int x) {  
    if (chosen[x] || (chosen[x - 1] + (n - x + 1) < m)) { // 剪枝  
        return;  
    }  
  
    if (x == n + 1) { // 选够了m个数  
        char *anstem = (char *)malloc((m * (MAX_NAME_LENGTH + 1) + m) * sizeof(char)); // 分配空间给答案字符串  
        if (!anstem) {  
            exit(1); // 如果分配失败，退出程序  
        }  
        anstem[0] = '\0'; // 初始化答案字符串为空  
        for (int j = 0; j < m; j++) {  
            strcat(anstem, name[chosen[j] - 1]);  
            if (j < m - 1) {  
                strcat(anstem, " ");  
            }  
        }  
        ans[ansSize] = anstem; // 将答案字符串添加到答案数组中  
        ansSize++; // 更新答案数量  
        return;  
    }  
  
    chosen[x] = 1; // 选择当前数  
    clc(x + 1); // 递归选择下一个数  
    chosen[x] = 0; // 取消选择当前数  
    clc(x + 1); // 递归选择下一个数  
}  
  
int main() {  
    scanf("%d %d", &n, &m); // 输入N和M  
  
    // 动态分配内存以存储名字、答案和选择的索引  
    name = (char **)malloc(n * sizeof(char *));  
    ans = (char **)malloc(MAX_COMBINATIONS * sizeof(char *));  
    chosen = (int *)malloc(n * sizeof(int));  
    if (!name || !ans || !chosen) {  
        exit(1); // 如果分配失败，退出程序  
    }  
  
    for (int i = 0; i < n; i++) {  
        name[i] = (char *)malloc((MAX_NAME_LENGTH + 1) * sizeof(char)); // 分配空间给每个名字  
        if (!name[i]) {  
            exit(1); // 如果分配失败，退出程序  
        }  
        scanf("%s", name[i]); // 输入名字  
    }  
  
    clc(1); // 开始计算组合  
  
    // 输出答案  
    for (int i = 0; i < ansSize; i++) {  
        printf("%s\n", ans[i]);  
        free(ans[i]); // 释放答案字符串占用的内存  
    }  
  
    // 释放其他分配的内存  
    for (int i = 0; i < n; i++) {  
        free(name[i]); // 释放名字字符串占用的内存  
    }  
    free(name);  
    free(ans);  
    free(chosen);  
  
    return 0;  
}